#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn=50010 ;
struct treap
{
    int num,k,l,r,f,a ;
    void clear()
    {
        l=r=f=0 ;
    }
    bool operator < (const treap &t) const{
        return k<t.k ;
    }
}t[maxn] ;
int f[maxn],rc[maxn],lc[maxn] ;
void insert (int i)
{
    int j=i-1 ;
    while (t[j].a>t[i].a) j = t[j].f ;
    t[i].l = t[j].r ;
    t[t[j].r].f = i ;
    t[j].r = i ;
    t[i].f = j ;
}
void dfs(int i)
{
    if(i){
        dfs(t[i].l) ;
        f[t[i].num] = t[t[i].f].num ;
        lc[t[i].num] = t[t[i].l].num ;
        rc[t[i].num] = t[t[i].r].num ;
        dfs(t[i].r) ;
    }
}
int main()
{
    //freopen("test.in","r",stdin);
	int n ;
    scanf("%d",&n) ;
    t[0].clear() ;
    t[0].num=0 ;
    t[0].a = -3000000 ;
    for(int i=1 ; i<=n ; i++){
        t[i].num = i ;
        scanf("%d%d",&t[i].k,&t[i].a) ;
    }
    sort(t+1,t+n+1) ;
    for (int i=1 ; i<=n ; i++){
        insert(i) ;
    }
    dfs(t[0].r) ;
    printf("YES\n") ;
    for (int i=1 ; i<=n ; i++){
       printf("%d %d %d\n",f[i],lc[i],rc[i]) ;
    }
    return 0;
}
